home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / system / happyenv / happyenv-handler.asm < prev    next >
Assembly Source File  |  1996-06-18  |  38KB  |  1,922 lines

  1. *************************
  2. *   HappyENV-Handler    *
  3. *    12.6.96        *
  4. *  (C) Martin Gierich    *
  5. *************************
  6.  
  7. ; See documentation about Copyright&Disclaimer
  8.  
  9. ;DEBUG        = 1
  10. ;VOLUME        = 1
  11. ;VERBOSE    = 1
  12. AUTOCOPY    = 1
  13.  
  14.     INCDIR    source:stripinc/
  15.     INCLUDE    exec/exec_lib.i
  16.     INCLUDE    dos/dos_lib.i
  17.     INCLUDE    dos/dosextens.i
  18.     INCLUDE    dos/filehandler.i
  19.     INCLUDE    dos/notify.i
  20.     INCLUDE debug.i
  21.  
  22. CALL    MACRO
  23.     jsr    _LVO\1(a6)
  24.     ENDM
  25.  
  26. mn_Node        = 0
  27. lib_Version    = 20
  28. _LVOToUpper    = -174
  29. DOS_TRUE    = -1
  30. DOS_FALSE    = 0
  31. MEMF_CLEAR    = $10000
  32. MAXPATH        = 120
  33. MAXNAME        = 32
  34.  
  35.  
  36. * notify list node structure
  37.         RSRESET
  38. myn_Link    RS.L    1
  39. myn_Request    RS.L    1    notify-request
  40. myn_Key        RS.L    1    pointer to file
  41. myn_Name    RS.B    MAXPATH
  42. myn_SIZEOF    RS.W    0
  43.  
  44. * lock structure for Lock() and open files
  45.         RSRESET
  46. myl_Link    RS.L    1
  47. myl_Key        RS.L    1
  48. myl_Access    RS.L    1
  49. myl_Task    RS.L    1
  50. myl_Volume    RS.L    1
  51. myl_Pos        RS.L    1    position in file (read/write)
  52. myl_Data    RS.L    1    start of file data (read)
  53. myl_Start    RS.L    1    start of block list (write)
  54. myl_Block    RS.L    1    current block (write)
  55. myl_BlockPos    RS.L    1    position in current block (write)
  56. myl_Size    RS.L    1    size of file
  57. myl_Mode    RS.B    1    0=simple lock, -1=write, 1=read
  58. myl_Pad        RS.B    1
  59. myl_SIZEOF    RS.W    0
  60.  
  61. * structure for file or dir
  62.         RSRESET
  63. myf_Link    RS.L    1    next file/dir
  64. myf_Parent    RS.L    1    parent dir
  65. myf_First    RS.L    0    dir:  points to first entry
  66. myf_Size    RS.L    1    file: size of filedata
  67. myf_Type    RS.B    1    -3=file, 0=hidden, 1=root, 2=dir
  68. myf_Locks    RS.B    1    number of locks, -1=write lock
  69. myf_DataOffs    RS.B    1    offset to start of data
  70. myf_Name    RS.W    0    name (dynamic), then data
  71.  
  72. * private main structure
  73.         RSRESET
  74. CharTable    RS.B    256
  75. DosBase        RS.L    1
  76. MyProcess    RS.L    1
  77. MyMsgPort    RS.L    1
  78. MyMemPool    RS.L    1
  79. MyDeviceNode    RS.L    1
  80. MyVolumeBPTR    RS.L    1
  81. NotifyList    RS.L    1
  82. CopyfromLock    RS.L    1
  83. CopyfromPort    RS.L    1
  84. MyPacket    RS.B    sp_SIZEOF
  85. VolumeNode    RS.B    DevList_SIZEOF
  86. VolumeName    RS.B    MAXNAME
  87. NotifyPort    RS.B    MP_SIZE
  88. PacketPort    RS.B    MP_SIZE
  89. FileSize    RS.L    1
  90. TotalSize    RS.L    1
  91. NumLocks    RS.L    1
  92. Kickver        RS.W    1
  93. WriteProtected    RS.B    1
  94. NSignal        RS.B    1
  95. PSignal        RS.B    1
  96. Paddy1        RS.B    1
  97. RootDir        RS.B    myf_Name+8
  98. Paddy2        RS.B    3
  99. TempPath    RS.B    MAXPATH
  100. TempName    RS.B    MAXNAME
  101. My_SIZEOF    RS.W    0
  102.  
  103. MyPkt        = MyPacket+sp_Pkt
  104.  
  105. *******************************************************
  106.  
  107. *******************************************************
  108.  
  109. ;a4=DOSpacket
  110. ;a5=private struct
  111. ;a6=execbase
  112. start:    movem.l    d2-d7/a2-a6,-(sp)    do some basic inits
  113.     move.l    4.w,a6
  114.     move.l    #My_SIZEOF,d0
  115.     move.l    #MEMF_CLEAR!1,d1
  116.     CALL    AllocMem
  117.     tst.l    d0
  118.     beq    exit1
  119.     move.l    d0,a5
  120.     DBUG1    txstart,a5
  121.     lea    dosname(pc),a1
  122.     moveq    #33,d0
  123.     CALL    OpenLibrary
  124.     move.l    d0,DosBase(a5)
  125.     beq    exit2
  126.     move.w    lib_Version(a6),Kickver(a5)
  127.     sub.l    a1,a1
  128.     CALL    FindTask
  129.     move.l    d0,MyProcess(a5)
  130.     cmp.w    #36,Kickver(a5)
  131.     blo.s    .OS13
  132.     move.l    d0,a0
  133.     bset    #0,pr_Flags+3(a0)
  134. .OS13    add.l    #pr_MsgPort,d0
  135.     move.l    d0,MyMsgPort(a5)
  136.     move.b    #1,RootDir+myf_Type(a5)
  137.     cmp.w    #39,Kickver(a5)
  138.     blo.s    .OS20
  139.     moveq    #1,d0
  140.     move.l    #5000,d1
  141.     move.l    #2000,d2
  142.     CALL    CreatePool
  143.     move.l    d0,MyMemPool(a5)
  144.  
  145. .OS20    move.l    MyMsgPort(a5),a2    process startup message
  146.     bsr    GetPacket
  147.     move.l    d0,a4
  148.     move.l    dp_Arg3(a4),d0
  149.     lsl.l    #2,d0
  150.     move.l    d0,MyDeviceNode(a5)
  151.     move.l    d0,a0
  152.     move.l    MyMsgPort(a5),dn_Task(a0)
  153.     clr.l    dn_SegList(a0)
  154.     move.l    dn_Name(a0),a0
  155.     lea    RootDir+myf_Name(a5),a1
  156.     moveq    #6,d0
  157.     bsr    CopyBSTR2Char
  158.     moveq    #DOS_TRUE,d0
  159.     move.l    d0,dp_Res1(a4)
  160.     bsr    ReplyPacket
  161.  
  162.     lea    VolumeNode(a5),a2    set up volume node
  163.     move.l    a2,d0
  164.     lsr.l    #2,d0
  165.     move.l    d0,MyVolumeBPTR(a5)
  166.     moveq    #2,d0
  167.     move.l    d0,dl_Type(a2)
  168.     move.l    MyMsgPort(a5),dl_Task(a2)
  169.     move.l    #"DOS"<<8,dl_DiskType(a2)
  170.     lea    volname(pc),a0
  171.     lea    VolumeName(a5),a1
  172.     moveq    #MAXNAME-2,d0
  173.     bsr    CopyChar2BSTR
  174.     move.l    d0,dl_Name(a2)
  175.     IFD    VOLUME
  176.     move.l    DosBase(a5),a0
  177.     move.l    dl_Root(a0),a0
  178.     move.l    rn_Info(a0),a0
  179.     add.l    a0,a0
  180.     add.l    a0,a0
  181.     move.l    di_DevInfo(a0),d0
  182.     move.l    d0,VolumeNode(a5)
  183.     move.l    MyVolumeBPTR(a5),di_DevInfo(a0)
  184.     ENDC
  185.  
  186.     bsr    InitConversion        init upper case table
  187.     lea    NotifyPort(a5),a2    create msgport for notify
  188.     move.b    #NT_MSGPORT,LN_TYPE(a2)
  189.     moveq    #-1,d0
  190.     CALL    AllocSignal
  191.     tst.l    d0
  192.     bmi    exit3
  193.     move.b    d0,NSignal(a5)
  194.     move.b    d0,MP_SIGBIT(a2)
  195.     move.l    MyProcess(a5),MP_SIGTASK(a2)
  196.     lea    MP_MSGLIST(a2),a0
  197.     move.b    #NT_MESSAGE,LH_TYPE(a0)
  198.     NEWLIST    a0
  199.     lea    PacketPort(a5),a2    create msgport for DOSpackets
  200.     move.b    #NT_MSGPORT,LN_TYPE(a2)
  201.     moveq    #-1,d0
  202.     CALL    AllocSignal
  203.     tst.l    d0
  204.     bmi    exit3
  205.     move.b    d0,PSignal(a5)
  206.     move.b    d0,MP_SIGBIT(a2)
  207.     move.l    MyProcess(a5),MP_SIGTASK(a2)
  208.     lea    MP_MSGLIST(a2),a0
  209.     move.b    #NT_MESSAGE,LH_TYPE(a0)
  210.     NEWLIST    a0
  211.  
  212.     IFD    AUTOCOPY
  213.     CALL    Forbid
  214.     move.l    DosBase(a5),a0
  215.     move.l    dl_Root(a0),a0
  216.     move.l    rn_Info(a0),a0
  217.     add.l    a0,a0
  218.     add.l    a0,a0
  219.     lea    di_DevInfo(a0),a2
  220. .C    move.l    (a2),d0
  221.     beq    .D
  222.     lsl.l    #2,d0
  223.     move.l    d0,a2
  224.     move.l    dol_Name(a2),a0
  225.     add.l    a0,a0
  226.     add.l    a0,a0
  227.     lea    sysdisk(pc),a1
  228.     moveq    #0,d0
  229.     move.b    (a0)+,d0
  230.     bra.s    .F
  231. .G    move.b    (a1)+,d1
  232.     cmp.b    (a0)+,d1
  233.     bne.s    .C
  234. .F    dbra    d0,.G
  235.     tst.b    (a1)
  236.     bne.s    .C
  237.     CALL    Permit
  238.     move.l    dol_Task(a2),CopyfromPort(a5)
  239.     beq.s    .A
  240.     move.l    dol_Lock(a2),d3
  241.     beq.s    .A
  242.     move.l    d1,CopyfromLock(a5)
  243.     lea    envarc(pc),a0
  244.     lea    TempName(a5),a1
  245.     moveq    #MAXNAME-2,d0
  246.     bsr    CopyChar2BSTR
  247.     move.l    d0,d2
  248.     move.l    d3,d1
  249.     moveq    #ACCESS_READ,d3
  250.     moveq    #ACTION_LOCATE_OBJECT,d0
  251.     bsr    DoPacket
  252.     move.l    d0,CopyfromLock(a5)
  253.     DBUG2    txcopy,CopyfromPort(a5),CopyfromLock(a5)
  254.     bra.s    .A
  255. .D    CALL    Permit
  256. .A    ENDC
  257.  
  258. loop    move.l    MyMsgPort(a5),a2    enter main loop
  259.     bsr    GetPacket
  260.     move.l    d0,a4
  261.     bsr    GetNotify
  262.     clr.l    dp_Res1(a4)
  263.     clr.l    dp_Res2(a4)
  264.     move.l    dp_Type(a4),d0
  265.     DBUG4    txpack,d0,dp_Arg1(a4),dp_Arg2(a4),dp_Arg3(a4)
  266.     move.l    d0,d1
  267.     swap    d1
  268.     tst.w    d1
  269.     bne.s    .A
  270.     lea    start(pc),a1
  271.     lea    JumpTable(pc),a2
  272.     moveq    #0,d2
  273. .C    move.w    (a2)+,d1
  274.     bpl.s    .E
  275. .A    DBUG1    txerr1,d0
  276.     move.w    #ERROR_ACTION_NOT_KNOWN,dp_Res2+2(a4)
  277.     bra.s    .D
  278. .E    move.w    (a2)+,d2
  279.     cmp.w    d0,d1
  280.     bne.s    .C
  281.     add.l    d2,a1
  282.     jsr    (a1)
  283. .D    IFD    DEBUG
  284.     moveq    #DOS_TRUE,d0
  285.     cmp.l    dp_Res1(a4),d0
  286.     beq.s    .H
  287.     DBUG2    txres,dp_Res1(a4),dp_Res2(a4)
  288. .H    ENDC
  289.     bsr    ReplyPacket
  290.     bra    loop
  291.  
  292. AExit    addq.l    #4,sp        exit routine
  293.     moveq    #DOS_TRUE,d0
  294.     move.l    d0,dp_Res1(a4)
  295.     bsr    ReplyPacket
  296.     tst.l    NumLocks(a5)
  297.     bne    loop
  298.     move.l    MyDeviceNode(a5),a0
  299.     clr.l    dn_Task(a0)
  300.     bsr    FlushPackets
  301.     IFD    VOLUME
  302.     move.l    DosBase(a5),a0
  303.     move.l    dl_Root(a0),a0
  304.     move.l    rn_Info(a0),a0
  305.     add.l    a0,a0
  306.     add.l    a0,a0
  307.     move.l    VolumeNode(a5),d0
  308.     move.l    d0,di_DevInfo(a0)
  309.     ENDC
  310.  
  311.     move.l    CopyfromLock(a5),d1
  312.     beq.s    .A
  313.     moveq    #ACTION_FREE_LOCK,d0
  314.     bsr    DoPacket
  315. .A    moveq    #0,d0
  316.     move.b    PSignal(a5),d0
  317.     CALL    FreeSignal
  318.     moveq    #0,d0
  319.     move.b    NSignal(a5),d0
  320.     CALL    FreeSignal
  321. exit3    move.l    DosBase(a5),a1
  322.     CALL    CloseLibrary
  323. exit2    move.l    MyDeviceNode(a5),a0
  324.     clr.l    dn_Task(a0)
  325.     DBUG2    txend,FileSize(a5),TotalSize(a5)
  326.     move.l    MyMemPool(a5),d0
  327.     beq.s    .A
  328.     move.l    d0,a0
  329.     CALL    DeletePool
  330. .A    move.l    a5,a1
  331.     move.l    #My_SIZEOF,d0
  332.     CALL    FreeMem
  333. exit1    movem.l    (sp)+,d2-d7/a2-a6
  334.     moveq    #0,d0
  335.     rts
  336.  
  337. *******************************************************
  338.  
  339. JumpTable:
  340.     dc.w    ACTION_NIL,NoAction-start
  341.     dc.w    ACTION_SET_PROTECT,NoAction-start
  342.     dc.w    ACTION_SET_COMMENT,NoAction-start
  343.     dc.w    ACTION_SET_DATE,NoAction-start
  344.     dc.w    ACTION_FLUSH,NoAction-start
  345.     dc.w    ACTION_IS_FILESYSTEM,NoAction-start
  346.  
  347.     dc.w    ACTION_DIE,AExit-start
  348.     dc.w    ACTION_CURRENT_VOLUME,ACurrentVolume-start
  349.     dc.w    ACTION_RENAME_DISK,ARenameDisk-start
  350.     dc.w    ACTION_WRITE_PROTECT,AWriteProtect-start
  351.  
  352.     dc.w    ACTION_FINDUPDATE,AOpenNewfile-start
  353.     dc.w    ACTION_FINDINPUT,AOpenOldfile-start
  354.     dc.w    ACTION_FINDOUTPUT,AOpenNewfile-start
  355.     dc.w    ACTION_END,ACloseFile-start
  356.     dc.w    ACTION_SEEK,ASeekPosition-start
  357.     dc.w    ACTION_READ,AReadFile-start
  358.     dc.w    ACTION_WRITE,AWriteFile-start
  359.     dc.w    ACTION_DELETE_OBJECT,ADeleteObject-start
  360.     dc.w    ACTION_RENAME_OBJECT,ARenameObject-start
  361.     dc.w    ACTION_CREATE_DIR,ACreateDir-start
  362.  
  363.     dc.w    ACTION_LOCATE_OBJECT,ALocateObject-start
  364.     dc.w    ACTION_PARENT,AParentDir-start
  365.     dc.w    ACTION_COPY_DIR,ADuplicateLock-start
  366.     dc.w    ACTION_FREE_LOCK,AFreeLock-start
  367.     dc.w    ACTION_SAME_LOCK,ASameLock-start
  368.     dc.w    ACTION_EXAMINE_OBJECT,AExamineObject-start
  369.     dc.w    ACTION_EXAMINE_FH,AExamineFH-start
  370.     dc.w    ACTION_EXAMINE_NEXT,AExamineNext-start
  371.     dc.w    ACTION_DISK_INFO,ADiskInfo1-start
  372.     dc.w    ACTION_INFO,ADiskInfo2-start
  373.  
  374.     dc.w    ACTION_ADD_NOTIFY,AAddNotify-start
  375.     dc.w    ACTION_REMOVE_NOTIFY,ARemoveNotify-start
  376.     dc.w    ACTION_SET_FILE_SIZE,ASetFileSize-start
  377. ;    dc.w    ACTION_FH_FROM_LOCK,AFHfromLock-start
  378. ;    dc.w    ACTION_CHANGE_MODE,AChangeMode-start
  379.     dc.w    ACTION_COPY_DIR_FH,ADupLockFromFH-start
  380.     dc.w    ACTION_PARENT_FH,AParentFromFH-start
  381.     dc.w    -1
  382.  
  383.         IFD    VOLUME
  384. volname        dc.b    "Environment",0
  385.         ENDC
  386.         IFND    VOLUME
  387. volname        dc.b    "Env",0
  388.         ENDC
  389. version        dc.b    "$VER: HappyENV-Handler 0.7 (12.6.96)",10,0
  390. dosname        dc.b    "dos.library",0
  391. utilname    dc.b    "utility.library",0
  392. sysdisk        dc.b    "SYS",0
  393. envarc        dc.b    "SYS:Prefs/Env-Archive",0
  394.         even
  395.  
  396. *******************************************************
  397.  
  398. * Init to-upper-conversion table
  399. InitConversion:
  400.     lea    CharTable(a5),a2
  401.     move.w    #255,d0
  402. .A    move.b    d0,0(a2,d0.w)
  403.     dbra    d0,.A
  404.     moveq    #"A",d0
  405. .C    move.b    d0,"a"-"A"(a2,d0.w)
  406.     addq.w    #1,d0
  407.     cmp.b    #"Z"+1,d0
  408.     bne.s    .C
  409.     move.w    #192,d0
  410. .F    move.b    d0,224-192(a2,d0.w)
  411.     addq.w    #1,d0
  412.     cmp.b    #222+1,d0
  413.     bne.s    .F
  414.  
  415.     lea    utilname(pc),a1    open utility.library
  416.     moveq    #37,d0
  417.     CALL    OpenLibrary
  418.     tst.l    d0
  419.     beq.s    .D
  420.     move.l    d0,a6
  421.     move.w    #255,d2
  422. .E    move.w    d2,d0
  423.     CALL    ToUpper
  424.     move.b    d0,0(a2,d2.w)
  425.     dbra    d2,.E
  426.     move.l    a6,a1
  427.     move.l    4.w,a6
  428.     CALL    CloseLibrary
  429. .D    rts
  430.  
  431.  
  432. * Wait for a packet, then get it
  433. * ENTRY: a2=msgport
  434. * EXIT:  d0=packet
  435. GetPacket:
  436. .A    move.l    a2,a0
  437.     CALL    WaitPort
  438.     move.l    a2,a0
  439.     CALL    GetMsg
  440.     tst.l    d0
  441.     beq.s    .A
  442.     move.l    d0,a0
  443.     move.l    mn_Node+LN_NAME(a0),d0
  444.     beq.s    .A
  445.     rts
  446.  
  447. * Reply packet in a4
  448. ReplyPacket:
  449.     move.l    a4,a2
  450.     move.l    dp_Port(a4),a0        reply port
  451.     move.l    MyMsgPort(a5),dp_Port(a2)
  452. * ENTRY: a2=packet to send, a0=msgport to send to
  453. SendPacket:
  454.     move.l    dp_Link(a2),a1        message to send
  455.     move.l    a2,mn_Node+LN_NAME(a1)
  456.     clr.l    mn_Node+LN_SUCC(a1)
  457.     clr.l    mn_Node+LN_PRED(a1)
  458.     move.b    #NT_MESSAGE,mn_Node+LN_TYPE(a1)
  459.     CALL    PutMsg
  460.     rts
  461.  
  462. FlushPackets:
  463. .A    move.l    MyMsgPort(a5),a0
  464.     CALL    GetMsg
  465.     tst.l    d0
  466.     beq.s    .C
  467.     move.l    d0,a0
  468.     move.l    mn_Node+LN_NAME(a0),d0
  469.     beq.s    .A
  470.     move.l    d0,a4
  471.     clr.l    dp_Res1(a4)
  472.     move.w    #ERROR_ACTION_NOT_KNOWN,dp_Res2+2(a4)
  473.     bsr    ReplyPacket
  474.     bra.s    .A
  475. .C    rts
  476.  
  477. * Send a packet to the handler in CopyfromPort and wait for a reply
  478. * ENTRY: d0=dp_Type, d1=dp_Arg1, d2=dp_Arg2, d3=dp_Arg3
  479. * EXIT:  d0=dp_Res1, d1=dp_Res2, Z-flag
  480. DoPacket:
  481.     move.l    a2,-(sp)
  482.     lea    MyPacket(a5),a1
  483.     lea    sp_Pkt(a1),a2
  484.     move.l    a1,dp_Link(a2)
  485.     lea    PacketPort(a5),a1
  486.     move.l    a1,dp_Port(a2)
  487.     move.l    d0,dp_Type(a2)
  488.     move.l    d1,dp_Arg1(a2)
  489.     move.l    d2,dp_Arg2(a2)
  490.     move.l    d3,dp_Arg3(a2)
  491.     move.l    CopyfromPort(a5),a0
  492.     bsr    SendPacket
  493.     lea    PacketPort(a5),a2
  494.     bsr    GetPacket
  495.     move.l    d0,a0
  496.     DBUG4    txpkt,a0,dp_Type(a0),dp_Res1(a0),dp_Res2(a0)
  497. ;    bsr    wait_c
  498.     move.l    dp_Res2(a0),d1
  499.     move.l    dp_Res1(a0),d0
  500.     move.l    (sp)+,a2
  501.     rts
  502.  
  503. *******************************************************
  504.  
  505. *******************************************************
  506.  
  507. NoAction:
  508.     moveq    #DOS_TRUE,d0
  509.     move.l    d0,dp_Res1(a4)
  510.     rts
  511.  
  512. ACurrentVolume:
  513.     move.l    MyVolumeBPTR(a5),dp_Res1(a4)
  514.     rts
  515.  
  516. ARenameDisk:
  517.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  518.     tst.b    WriteProtected(a5)
  519.     bne.s    .fail
  520.     move.l    dp_Arg1(a4),a0
  521.     lea    TempName(a5),a1
  522.     moveq    #MAXNAME-2,d0
  523.     bsr    CopyBSTR2Char
  524.     lea    TempName(a5),a0
  525.     lea    VolumeName(a5),a1
  526.     moveq    #MAXNAME-2,d0
  527.     bsr    CopyChar2BSTR
  528.     moveq    #DOS_TRUE,d0
  529.     move.l    d0,dp_Res1(a4)
  530. .fail    rts
  531.  
  532. AWriteProtect:
  533.     move.l    dp_Arg1(a4),d0
  534.     move.b    d0,WriteProtected(a5)
  535.     moveq    #DOS_TRUE,d0
  536.     move.l    d0,dp_Res1(a4)
  537.     rts    
  538.  
  539. AOpenOldfile:
  540.     move.l    dp_Arg1(a4),a3
  541.     add.l    a3,a3
  542.     add.l    a3,a3
  543.     clr.l    fh_Interactive(a3)
  544.     move.l    dp_Arg3(a4),a0
  545.     move.l    dp_Arg2(a4),d0
  546.     moveq    #ACCESS_READ,d2
  547.     bsr    LocateObject
  548.     move.l    d0,fh_Arg1(a3)
  549.     beq.s    .fail
  550.     move.l    d0,a0
  551.     move.l    myl_Key(a0),a1
  552.     move.w    #ERROR_OBJECT_WRONG_TYPE,dp_Res2+2(a4)
  553.     tst.b    myf_Type(a1)    do not open dirs
  554.     bmi.s    .A
  555.     move.l    a0,a1
  556.     bsr    FreeLock
  557.     bra.s    .fail
  558. .A    clr.l    myl_Pos(a0)
  559.     move.l    myf_Size(a1),myl_Size(a0)
  560.     moveq    #0,d0
  561.     move.b    myf_DataOffs(a1),d0
  562.     add.l    d0,a1
  563.     move.l    a1,myl_Data(a0)
  564.     clr.l    myl_Start(a0)
  565.     clr.l    myl_Block(a0)
  566.     clr.l    myl_BlockPos(a0)
  567.     move.b    #1,myl_Mode(a0)
  568.     moveq    #DOS_TRUE,d0
  569.     move.l    d0,dp_Res1(a4)
  570. ;    DBUG1    txopeno,fh_Arg1(a3)
  571. .fail    rts
  572.  
  573. AOpenNewfile:
  574.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  575.     tst.b    WriteProtected(a5)
  576.     bne    .fail
  577.     move.w    #ERROR_OBJECT_EXISTS,dp_Res2+2(a4)
  578.     move.l    dp_Arg1(a4),a3
  579.     add.l    a3,a3
  580.     add.l    a3,a3
  581.     clr.l    fh_Interactive(a3)
  582.     move.l    dp_Arg2(a4),d0    does file already exist ?
  583.     move.l    dp_Arg3(a4),a0
  584.     bsr    DelSearchObject
  585.     beq.s    .A
  586.     move.l    d0,a1
  587.     tst.b    myf_Type(a1)    do not overwrite dirs
  588.     bpl    .fail
  589.     bsr    DeleteObject
  590.     beq    .fail
  591. .A    bsr    SplitPath
  592.     move.w    #ERROR_DIR_NOT_FOUND,dp_Res2+2(a4)
  593.     move.l    dp_Arg2(a4),d0
  594.     bsr    CreatePath
  595.     beq    .fail
  596.     move.l    a3,-(sp)
  597.     move.l    d0,a3
  598.     lea    TempName(a5),a2
  599.     moveq    #0,d2
  600.     bsr    CreateNewObject
  601.     move.l    (sp)+,a3
  602.     beq.s    .fail
  603.     move.l    d0,a2
  604.     moveq    #ACCESS_WRITE,d2
  605.     bsr    CreateLock
  606.     move.l    d0,fh_Arg1(a3)
  607.     beq.s    .fail
  608.     move.l    d0,a0
  609.     move.b    #-1,myl_Mode(a0)
  610.     clr.l    myl_Pos(a0)
  611.     clr.l    myl_Data(a0)
  612.     clr.l    myl_Start(a0)
  613.     clr.l    myl_Block(a0)
  614.     clr.l    myl_BlockPos(a0)
  615.     clr.l    myl_Size(a0)
  616.     moveq    #DOS_TRUE,d0
  617.     move.l    d0,dp_Res1(a4)
  618. ;    DBUG1    txopenn,fh_Arg1(a3)
  619. .fail    rts
  620.  
  621. ACloseFile:
  622.     move.l    dp_Arg1(a4),a1
  623.     cmp.b    #-1,myl_Mode(a1)
  624.     beq.s    .D
  625.     bsr    FreeLock
  626.     bra.s    .ok
  627. .D    move.l    myl_Size(a1),d2
  628.     move.l    myl_Key(a1),a2
  629.     move.l    myf_Parent(a2),a3
  630.     lea    myf_Name(a2),a2
  631.     bsr    CreateNewObject
  632.     beq.s    .fail
  633.     move.l    d0,d4
  634.     move.l    d0,a3
  635.     add.l    d1,a3
  636.     move.l    dp_Arg1(a4),a2
  637.     move.l    myl_Start(a2),d3
  638. .F    tst.l    d3
  639.     beq.s    .A
  640.     move.l    d3,-(sp)
  641.     move.l    d3,a0
  642.     move.l    (a0)+,d3
  643.     move.l    (a0)+,d2
  644.     move.l    a3,a1
  645.     move.l    d2,d0
  646.     CALL    CopyMem
  647.     add.l    d2,a3
  648.     move.l    d2,d0
  649.     addq.l    #8,d0
  650.     move.l    (sp)+,a1
  651.     bsr    FreeMem
  652.     bra.s    .F
  653. .A    move.l    a2,a1
  654.     move.l    myl_Key(a2),a2
  655.     bsr    FreeLock
  656.     move.l    a2,a1
  657.     bsr    DeleteObj
  658.     beq.s    .fail
  659.     move.l    d4,a0
  660.     bsr    CheckNotify
  661. .ok    moveq    #DOS_TRUE,d0
  662.     move.l    d0,dp_Res1(a4)
  663. .fail    rts
  664.  
  665. AWriteFile:
  666.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  667.     tst.b    WriteProtected(a5)
  668.     bne    .fail
  669.     moveq    #-1,d0
  670.     move.l    d0,dp_Res1(a4)
  671.     move.l    dp_Arg1(a4),a2    lock
  672.     move.l    dp_Arg2(a4),a3    buffer
  673.     move.l    dp_Arg3(a4),d3    length
  674.     move.w    #ERROR_WRITE_PROTECTED,dp_Res2+2(a4)
  675.     cmp.b    #-1,myl_Mode(a2)
  676.     bne    .fail
  677. .F    move.l    d3,d2
  678.     move.l    myl_Block(a2),d0
  679.     beq    .E
  680.     move.l    d0,a1
  681.     move.l    4(a1),d0
  682.     sub.l    myl_BlockPos(a2),d0
  683.     beq.s    .C
  684.     bmi.s    .C
  685.     cmp.l    d2,d0
  686.     bhs.s    .D
  687.     move.l    d0,d2
  688. .D    addq.l    #8,a1
  689.     add.l    myl_BlockPos(a2),a1
  690.     move.l    a3,a0
  691.     move.l    d2,d0
  692.     CALL    CopyMem
  693.     DBUG2    txwins,d2,myl_Pos(a2)
  694.     add.l    d2,a3
  695.     add.l    d2,myl_Pos(a2)
  696.     add.l    d2,myl_BlockPos(a2)
  697.     sub.l    d2,d3
  698.     beq.s    .ok
  699.     bra.s    .F
  700. .C    move.l    (a1),d0
  701.     beq.s    .E
  702.     move.l    d0,myl_Block(a2)
  703.     clr.l    myl_BlockPos(a2)
  704.     bra    .F    
  705.     
  706. .E    move.w    #ERROR_DISK_FULL,dp_Res2+2(a4)
  707.     move.l    d3,d0
  708.     addq.l    #8,d0
  709.     bsr    AllocMem
  710.     beq    .fail
  711.     move.l    myl_Block(a2),a0
  712.     move.l    d0,myl_Block(a2)
  713.     move.l    a0,d1
  714.     bne.s    .A
  715.     lea    myl_Start(a2),a0
  716. .A    move.l    d0,(a0)
  717.  
  718.     move.l    d3,d2
  719.     move.l    d0,a1
  720.     clr.l    (a1)+
  721.     move.l    d2,(a1)+
  722.     move.l    a3,a0
  723.     move.l    d2,d0
  724.     CALL    CopyMem
  725.     add.l    d2,myl_Size(a2)
  726.     add.l    d2,myl_Pos(a2)
  727.     move.l    d2,myl_BlockPos(a2)
  728. .ok    move.l    dp_Arg3(a4),dp_Res1(a4)
  729.     DBUG3    txwrite,dp_Arg3(a4),myl_Pos(a2),myl_Size(a2)
  730. .fail    rts
  731.  
  732. AReadFile:
  733.     moveq    #-1,d0
  734.     move.l    d0,dp_Res1(a4)
  735.     move.l    dp_Arg1(a4),a2
  736.     move.w    #ERROR_READ_PROTECTED,dp_Res2+2(a4)
  737.     cmp.b    #1,myl_Mode(a2)
  738.     bne.s    .fail
  739.     move.l    myl_Size(a2),d0
  740.     move.l    myl_Pos(a2),a0
  741.     sub.l    a0,d0
  742.     move.l    dp_Arg3(a4),d2
  743.     cmp.l    d0,d2
  744.     bls.s    .A
  745.     exg.l    d0,d2
  746. .A    move.l    myl_Data(a2),d0
  747.     add.l    d0,a0
  748.     move.l    dp_Arg2(a4),a1
  749.     move.l    d2,d0
  750.     CALL    CopyMem
  751.     add.l    d2,myl_Pos(a2)
  752.     move.l    d2,dp_Res1(a4)
  753.     DBUG3    txread,d2,dp_Arg3(a4),myl_Pos(a2)
  754. .fail    rts
  755.  
  756. ASeekPosition
  757.     move.l    dp_Arg1(a4),a2
  758.     move.l    dp_Arg2(a4),d1    position
  759.     move.l    dp_Arg3(a4),d2    mode
  760.     clr.w    dp_Res2+2(a4)
  761.     move.l    myl_Pos(a2),d3
  762.     move.l    myl_Size(a2),d4
  763.  
  764.     moveq    #OFFSET_BEGINNING,d0
  765.     cmp.l    d0,d2
  766.     beq.s    .E
  767.     moveq    #OFFSET_END,d0
  768.     cmp.l    d0,d2
  769.     bne.s    .C
  770.     add.l    d4,d1
  771.     bra.s    .E
  772. .C    moveq    #OFFSET_CURRENT,d0
  773.     cmp.l    d0,d2
  774.     bne.s    .fail
  775.     add.l    d3,d1
  776. .E    move.l    d1,myl_Pos(a2)
  777.     bmi.s    .A
  778.     cmp.l    d1,d4
  779.     bhs.s    Seeek
  780.     move.l    d4,myl_Pos(a2)
  781.     bra.s    .fail
  782. .A    clr.l    myl_Pos(a2)
  783. .fail    move.w    #ERROR_SEEK_ERROR,dp_Res2+2(a4)
  784.     moveq    #-1,d3
  785.  
  786. Seeek    cmp.b    #-1,myl_Mode(a2)
  787.     bne.s    .A
  788.     move.l    myl_Pos(a2),d2
  789.     move.l    myl_Start(a2),d0
  790.     beq.s    .A
  791.     bra.s    .E
  792. .D    move.l    (a0),d0
  793.     beq.s    .C
  794. .E    move.l    d0,a0
  795.     move.l    4(a0),d1
  796.     sub.l    d1,d2
  797.     beq.s    .F
  798.     bpl.s    .D
  799. .F    add.l    d1,d2
  800. .C    move.l    a0,myl_Block(a2)
  801.     move.l    d2,myl_BlockPos(a2)
  802. .A    move.l    d3,dp_Res1(a4)
  803.     DBUG1    txseek,myl_Pos(a2)
  804.     rts
  805.  
  806. ADeleteObject:
  807.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  808.     tst.b    WriteProtected(a5)
  809.     bne.s    .fail
  810.     move.w    #ERROR_OBJECT_NOT_FOUND,dp_Res2+2(a4)
  811.     move.l    dp_Arg1(a4),d0
  812.     move.l    dp_Arg2(a4),a0
  813.     bsr    SearchObject
  814.     beq.s    .fail
  815.     movem.l    d0-d1,-(sp)
  816.     move.l    d0,a0
  817.     moveq    #1,d0
  818.     bsr    NotifyObject
  819.     movem.l    (sp)+,d0-d1
  820.     move.l    d0,a1
  821.     bsr    DeleteObject
  822.     beq.s    .fail
  823.     moveq    #DOS_TRUE,d0
  824.     move.l    d0,dp_Res1(a4)
  825. .fail    rts
  826.  
  827. ARenameObject:
  828.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  829.     tst.b    WriteProtected(a5)
  830.     bne    .fail
  831.     move.w    #ERROR_OBJECT_NOT_FOUND,dp_Res2+2(a4)
  832.     move.l    dp_Arg1(a4),d0
  833.     move.l    dp_Arg2(a4),a0
  834.     bsr    SearchObject
  835.     beq    .fail
  836.     move.l    d0,a3
  837.     move.l    d1,d3
  838.     move.w    #ERROR_OBJECT_IN_USE,dp_Res2+2(a4)
  839.     tst.b    myf_Locks(a3)
  840.     bne    .fail
  841.     move.l    a3,a0
  842.     bsr    NotifyObject
  843.     move.w    #ERROR_OBJECT_EXISTS,dp_Res2+2(a4)
  844.     move.l    dp_Arg3(a4),d0
  845.     move.l    dp_Arg4(a4),a0
  846.     bsr    DelSearchObject
  847.     bne    .fail
  848.     bsr    SplitPath
  849.     move.w    #ERROR_DIR_NOT_FOUND,dp_Res2+2(a4)
  850.     move.l    dp_Arg3(a4),d0
  851.     bsr    SearchPath
  852.     beq    .fail
  853.     move.l    a3,-(sp)
  854.     moveq    #0,d2
  855.     tst.b    myf_Type(a3)
  856.     bpl.s    .D
  857.     move.l    myf_Size(a3),d2
  858. .D    move.l    d0,a3
  859.     lea    TempName(a5),a2
  860.     bsr    CreateNewObject
  861.     move.l    (sp)+,a3
  862.     beq.s    .fail
  863.     move.l    d0,a2
  864.     move.b    myf_Type(a3),myf_Type(a2)
  865.     bpl.s    .A
  866.     move.l    a2,a1        rename file
  867.     add.l    d1,a1
  868.     move.l    a3,a0
  869.     moveq    #0,d0
  870.     move.b    myf_DataOffs(a3),d0
  871.     add.l    d0,a0
  872.     move.l    myf_Size(a3),d0
  873.     CALL    CopyMem
  874.     bra.s    .C
  875. .A    move.l    myf_First(a3),d0    rename dir
  876.     clr.l    myf_First(a3)
  877.     move.l    d0,myf_First(a2)
  878.     beq.s    .C
  879. .E    move.l    d0,a0
  880.     move.l    a2,myf_Parent(a0)
  881.     move.l    myf_Link(a0),d0
  882.     bne.s    .E
  883. .C    move.l    d3,d1        end rename
  884.     move.l    a3,a1
  885.     bsr    DeleteObject
  886.     beq.s    .fail
  887.     move.l    a2,a0
  888.     bsr    CheckNotify
  889.     moveq    #DOS_TRUE,d0
  890.     move.l    d0,dp_Res1(a4)
  891. .fail    rts
  892.  
  893. *******************************************************
  894.  
  895. ALocateObject:
  896.     move.l    dp_Arg1(a4),d0
  897.     move.l    dp_Arg2(a4),a0
  898.     move.l    dp_Arg3(a4),d2
  899.     bsr    LocateObject
  900.     lsr.l    #2,d0
  901.     move.l    d0,dp_Res1(a4)
  902.     rts
  903.  
  904. ADupLockFromFH:
  905.     move.l    dp_Arg1(a4),d0
  906.     bra.s    DupLock
  907.  
  908. ADuplicateLock:
  909.     move.l    dp_Arg1(a4),d0
  910.     lsl.l    #2,d0
  911. DupLock    beq.s    .fail
  912.     move.l    d0,a0
  913.     move.l    myl_Key(a0),a2
  914.     moveq    #ACCESS_READ,d2
  915.     bsr    CreateLock
  916.     lsr.l    #2,d0
  917.     move.l    d0,dp_Res1(a4)
  918. .fail    rts
  919.  
  920. AParentFromFH:
  921.     move.l    dp_Arg1(a4),d0
  922.     bra.s    ParentD
  923. AParentDir:
  924.     move.l    dp_Arg1(a4),d0
  925.     lsl.l    #2,d0
  926. ParentD    beq.s    .fail
  927.     move.l    d0,a0
  928.     move.l    myl_Key(a0),a2
  929.     move.l    myf_Parent(a2),d0
  930.     beq.s    .fail
  931.     move.l    d0,a2
  932.     moveq    #ACCESS_READ,d2
  933.     bsr    CreateLock
  934.     lsr.l    #2,d0
  935.     move.l    d0,dp_Res1(a4)
  936. .fail    rts
  937.  
  938. AFreeLock:
  939.     move.l    dp_Arg1(a4),d0
  940.     beq.s    .fail
  941.     lsl.l    #2,d0
  942.     move.l    d0,a1
  943.     bsr    FreeLock
  944.     moveq    #DOS_TRUE,d0
  945.     move.l    d0,dp_Res1(a4)
  946. .fail    rts
  947.  
  948. ASameLock:
  949.     moveq    #LOCK_SAME_VOLUME,d0
  950.     move.l    d0,dp_Res1(a4)
  951.     move.l    dp_Arg1(a4),a0
  952.     add.l    a0,a0
  953.     add.l    a0,a0
  954.     move.l    dp_Arg2(a4),a1
  955.     add.l    a1,a1
  956.     add.l    a1,a1
  957.     move.l    myl_Key(a0),d0
  958.     cmp.l    myl_Key(a1),d0
  959.     bne.s    .A
  960.     moveq    #LOCK_SAME,d0
  961.     move.l    d0,dp_Res1(a4)
  962. .A    rts
  963.  
  964. AExamineFH:
  965.     move.l    dp_Arg1(a4),a0
  966.     bra.s    Exami
  967.  
  968. AExamineObject:
  969.     move.l    dp_Arg1(a4),a0
  970.     add.l    a0,a0
  971.     add.l    a0,a0
  972. Exami    move.l    myl_Key(a0),a0
  973.     move.l    dp_Arg2(a4),a1
  974.     add.l    a1,a1
  975.     add.l    a1,a1
  976. ;    DBUG1    txexam,a0
  977.     move.l    a1,a2
  978.     moveq    #fib_SIZEOF/4-1,d0
  979. .D    clr.l    (a2)+
  980.     dbra    d0,.D
  981. * ENTRY: a0=file, a1=fib
  982. ExamineObject:
  983.     moveq    #0,d1
  984.     move.b    myf_Type(a0),d0
  985.     ext.w    d0
  986.     ext.l    d0
  987.     move.l    d0,fib_DirEntryType(a1)
  988.     move.l    d0,fib_EntryType(a1)
  989.     bpl.s    .A
  990.     move.l    myf_Size(a0),d1
  991. .A    move.l    a0,fib_DiskKey(a1)
  992.     move.l    d1,fib_Size(a1)
  993.     move.l    d1,fib_NumBlocks(a1)
  994.     lea    myf_Name(a0),a0
  995.     lea    fib_FileName(a1),a1
  996.     moveq    #106,d0
  997.     bsr    CopyChar2BSTR
  998.     moveq    #DOS_TRUE,d0
  999.     move.l    d0,dp_Res1(a4)
  1000.     rts
  1001.  
  1002. AExamineNext:
  1003.     move.l    dp_Arg1(a4),a2
  1004.     add.l    a2,a2
  1005.     add.l    a2,a2
  1006.     move.l    dp_Arg2(a4),a1
  1007.     add.l    a1,a1
  1008.     add.l    a1,a1
  1009.     move.l    fib_DiskKey(a1),a0
  1010. ;    DBUG1    txexnx,a0
  1011.     cmp.l    myl_Key(a2),a0
  1012.     bne.s    .A
  1013.     move.w    #ERROR_OBJECT_WRONG_TYPE,dp_Res2+2(a4)
  1014.     tst.b    myf_Type(a0)
  1015.     bmi.s    .fail
  1016.     move.l    myf_First-myf_Link(a0),a0
  1017.     bra.s    .C
  1018. .A    move.l    myf_Link(a0),a0
  1019. .C    move.w    #ERROR_NO_MORE_ENTRIES,dp_Res2+2(a4)
  1020.     move.l    a0,d0
  1021.     beq.s    .fail
  1022.     tst.b    myf_Type(a0)
  1023.     beq.s    .A
  1024.     bra    ExamineObject
  1025. .fail    rts
  1026.  
  1027. ADiskInfo1:
  1028.     move.l    dp_Arg1(a4),a0
  1029.     bra.s    DiskInfo
  1030. ADiskInfo2:
  1031.     move.l    dp_Arg2(a4),a0
  1032. DiskInfo:
  1033.     add.l    a0,a0
  1034.     add.l    a0,a0
  1035.     move.l    a0,a1
  1036.     moveq    #id_SIZEOF/4-1,d0
  1037. .D    clr.l    (a1)+
  1038.     dbra    d0,.D
  1039.     move.l    NumLocks(a5),id_NumSoftErrors(a0)
  1040.     moveq    #ID_VALIDATED,d0
  1041.     tst.b    WriteProtected(a5)
  1042.     beq.s    .C
  1043.     moveq    #ID_WRITE_PROTECTED,d0
  1044. .C    move.l    d0,id_DiskState(a0)
  1045.     move.l    #1024,d1
  1046.     move.l    d1,id_BytesPerBlock(a0)
  1047.     lsr.l    #1,d1
  1048.     move.l    FileSize(a5),d0
  1049.     add.l    d1,d0
  1050.     lsr.l    #8,d0
  1051.     lsr.l    #2,d0
  1052.     move.l    d0,id_NumBlocksUsed(a0)
  1053.     move.l    TotalSize(a5),d0
  1054.     add.l    d1,d0
  1055.     lsr.l    #8,d0
  1056.     lsr.l    #2,d0
  1057.     bne.s    .A
  1058.     moveq    #1,d0
  1059. .A    move.l    d0,id_NumBlocks(a0)
  1060.     move.l    #"DOS"<<8,id_DiskType(a0)
  1061.     move.l    MyVolumeBPTR(a5),id_VolumeNode(a0)
  1062.     moveq    #DOS_TRUE,d0
  1063.     move.l    d0,dp_Res1(a4)
  1064.     rts
  1065.  
  1066. ACreateDir:
  1067.     move.w    #ERROR_DISK_WRITE_PROTECTED,dp_Res2+2(a4)
  1068.     tst.b    WriteProtected(a5)
  1069.     bne.s    .fail
  1070.     move.w    #ERROR_OBJECT_EXISTS,dp_Res2+2(a4)
  1071.     move.l    dp_Arg1(a4),d0
  1072.     move.l    dp_Arg2(a4),a0
  1073.     bsr    DelSearchObject
  1074.     bne.s    .fail
  1075.     bsr    SplitPath
  1076.     move.w    #ERROR_DIR_NOT_FOUND,dp_Res2+2(a4)
  1077.     move.l    dp_Arg1(a4),d0
  1078.     bsr    CreatePath
  1079.     beq.s    .fail
  1080.     move.l    d0,a3
  1081.     lea    TempName(a5),a2
  1082.     moveq    #0,d2
  1083.     bsr    CreateNewObject
  1084.     beq.s    .fail
  1085.     move.l    d0,a2
  1086.     move.b    #2,myf_Type(a2)
  1087.     moveq    #ACCESS_WRITE,d2
  1088.     bsr    CreateLock
  1089.     beq.s    .fail
  1090.     move.l    d0,a0
  1091.     lsr.l    #2,d0
  1092.     move.l    d0,dp_Res1(a4)
  1093.     move.l    myl_Key(a0),a0
  1094.     bsr    CheckNotify
  1095. .fail    rts
  1096.  
  1097. *******************************************************
  1098.  
  1099. ASetFileSize:
  1100.     move.l    dp_Arg1(a4),a2
  1101.     move.l    myl_Size(a2),dp_Res1(a4)
  1102.     rts
  1103.  
  1104. AFHfromLock:
  1105. AChangeMode:
  1106.     rts
  1107.  
  1108. *******************************************************
  1109.  
  1110. AAddNotify:
  1111.     move.w    #ERROR_NO_FREE_STORE,dp_Res2+2(a4)
  1112.     move.l    dp_Arg1(a4),a3
  1113.     move.l    #myn_SIZEOF,d0
  1114.     bsr    AllocMem
  1115.     beq.s    .fail
  1116.     move.l    d0,a2
  1117.     lea    NotifyList(a5),a0
  1118.     move.l    (a0),myn_Link(a2)
  1119.     move.l    a2,(a0)
  1120.     move.l    a3,myn_Request(a2)
  1121.     move.l    nr_FullName(a3),a0
  1122.     lea    myn_Name(a2),a1
  1123.     moveq    #MAXPATH-1,d0
  1124.     bsr    CopyChar2Char
  1125.     lea    myn_Name(a2),a0
  1126.     lea    TempPath(a5),a1
  1127.     moveq    #MAXPATH-1,d0
  1128.     bsr    CopyChar2Char
  1129.     moveq    #0,d0
  1130.     bsr    SearchPath
  1131.     move.l    d0,myn_Key(a2)
  1132.     IFD    DEBUG
  1133.     lea    myn_Name(a2),a0
  1134.     DBUG4    txanoti,a2,a3,a0,d0
  1135.     ENDC
  1136.     move.l    nr_Flags(a3),d0
  1137.     btst    #NRB_NOTIFY_INITIAL,d0
  1138.     beq.s    .A
  1139.     bsr    SendNotify
  1140. .A    moveq    #DOS_TRUE,d0
  1141.     move.l    d0,dp_Res1(a4)
  1142. .fail    rts
  1143.  
  1144. ARemoveNotify:
  1145.     move.w    #ERROR_OBJECT_IN_USE,dp_Res2+2(a4)
  1146.     move.l    dp_Arg1(a4),a2
  1147.     tst.l    nr_MsgCount(a2)
  1148.     bne.s    .fail
  1149.     move.w    #ERROR_OBJECT_NOT_FOUND,dp_Res2+2(a4)
  1150.     lea    NotifyList(a5),a1
  1151. .A    move.l    (a1),d0
  1152.     beq.s    .fail
  1153.     move.l    a1,a0
  1154.     move.l    d0,a1
  1155.     cmp.l    myn_Request(a1),a2
  1156.     bne.s    .A
  1157.     move.l    myn_Link(a1),myn_Link(a0)
  1158.     DBUG2    txrnoti,a1,a2
  1159.     move.l    #myn_SIZEOF,d0
  1160.     bsr    FreeMem
  1161.     moveq    #DOS_TRUE,d0
  1162.     move.l    d0,dp_Res1(a4)
  1163. .fail    rts
  1164.  
  1165. * Update myn_Key of notification list and do notify
  1166. * ENTRY: a0=file
  1167. UpdateNotify:
  1168.     move.l    a2,-(sp)
  1169.     lea    NotifyList(a5),a2
  1170.     bra.s    .A
  1171. .C    move.l    d0,a2
  1172.     tst.l    myn_Key(a2)
  1173.     bne.s    .A
  1174.     lea    myn_Name(a2),a0
  1175.     lea    TempPath(a5),a1
  1176.     moveq    #MAXPATH-1,d0
  1177.     bsr    CopyChar2Char
  1178.     moveq    #0,d0
  1179.     bsr    SearchPath
  1180.     move.l    d0,myn_Key(a2)
  1181.     IFD    DEBUG
  1182.     beq.s    .A
  1183.     lea    myn_Name(a2),a0
  1184.     DBUG2    txunoti,a0,d0
  1185.     ENDC
  1186. .A    move.l    (a2),d0
  1187.     bne.s    .C
  1188.     move.l    (sp)+,a2
  1189.     rts
  1190.  
  1191. * Check notification list for file/dir and parent dir and notify it.
  1192. * ENTRY: a0=file
  1193. CheckNotify:
  1194.     move.l    a0,-(sp)
  1195.     IFD    DEBUG
  1196.     lea    myf_Name(a0),a0
  1197.     DBUG1    txcnoti,a0
  1198.     ENDC
  1199.     bsr    UpdateNotify
  1200.     move.l    (sp)+,a0
  1201. NotifyObject:
  1202.     bsr    NotifyObj
  1203.     move.l    myf_Parent(a0),d1
  1204.     move.l    d1,a0
  1205.     beq.s    .E
  1206.     bsr    NotifyObj
  1207. .E    rts
  1208.  
  1209. NotifyObj:
  1210.     lea    NotifyList(a5),a2
  1211.     bra.s    .A
  1212. .C    move.l    d0,a2
  1213.     cmp.l    myn_Key(a2),a0
  1214.     bne.s    .A
  1215.     move.l    a0,-(sp)
  1216.     move.l    myn_Request(a2),a3
  1217.     bsr    SendNotify
  1218.     move.l    (sp)+,a0
  1219. .A    move.l    (a2),d0
  1220.     bne.s    .C
  1221.     rts
  1222.  
  1223. * Send a Notify message or set a Notify signal
  1224. * ENTRY: a3=NotifyRequest
  1225. SendNotify:
  1226.     btst    #NRB_SEND_SIGNAL,nr_Flags+3(a3)
  1227.     beq.s    .C
  1228.     move.l    nr_Task(a3),a1
  1229.     IFD    DEBUG
  1230.     move.l    LN_NAME(a1),d0
  1231.     lea    myn_Name(a2),a0
  1232.     DBUG2    txsnoti,d0,a0
  1233.     ENDC
  1234.     moveq    #0,d0
  1235.     move.b    nr_SignalNum(a3),d1
  1236.     bset    d1,d0
  1237.     CALL    Signal
  1238.     rts
  1239.  
  1240. .C    btst    #NRB_SEND_MESSAGE,nr_Flags+3(a3)
  1241.     beq    .D
  1242.     moveq    #NotifyMessage_SIZEOF,d0
  1243.     bsr    AllocMem
  1244.     beq    .D
  1245.     move.l    d0,a0
  1246.     move.l    d0,a1
  1247.     moveq    #NotifyMessage_SIZEOF/2-1,d0
  1248. .A    clr.w    (a0)+
  1249.     dbra    d0,.A
  1250.     move.b    #NT_MESSAGE,LN_TYPE(a1)
  1251.     lea    NotifyPort(a5),a0
  1252.     move.l    a0,MN_REPLYPORT(a1)
  1253.     move.w    #NotifyMessage_SIZEOF,MN_LENGTH(a1)
  1254.     move.l    #$40000000,nm_Class(a1)
  1255.     move.w    #$1234,nm_Code(a1)
  1256.     move.l    a3,nm_NReq(a1)
  1257.     IFD    DEBUG
  1258.     move.l    a2,-(sp)
  1259.     move.l    nr_Port(a3),a0
  1260.     move.l    MP_SIGTASK(a0),a0
  1261.     move.l    LN_NAME(a0),a0
  1262.     lea    myn_Name(a2),a2
  1263.     DBUG3    txmnoti,a1,a0,a2
  1264.     move.l    (sp)+,a2
  1265.     ENDC
  1266.     move.l    nr_Port(a3),a0
  1267.     CALL    PutMsg
  1268.     addq.l    #1,nr_MsgCount(a3)
  1269. ;    btst    #NRB_WAIT_REPLY,nr_Flags+3(a3)
  1270. ;    beq.s    .D
  1271. ;    lea    NotifyPort(a5),a0
  1272. ;    CALL    WaitPort
  1273. ;    bsr    GetNotify
  1274. .D    rts
  1275.  
  1276. * Handle replies of Notify message
  1277. GetNotify:
  1278. .A    lea    NotifyPort(a5),a0
  1279.     CALL    GetMsg
  1280.     tst.l    d0
  1281.     beq.s    .E
  1282.     move.l    d0,a1
  1283.     DBUG1    txgnoti,a1
  1284.     move.l    nm_NReq(a1),a0
  1285.     subq.l    #1,nr_MsgCount(a0)
  1286.     moveq    #NotifyMessage_SIZEOF,d0
  1287.     bsr    FreeMem
  1288.     bra.s    .A
  1289. .E    rts
  1290.  
  1291. *******************************************************
  1292.  
  1293. *******************************************************
  1294.  
  1295. * ENTRY: a2=name, a3=parent dir, d2=data size
  1296. * EXIT:  d1=offset of data, d0=new file, Z-flag
  1297. CreateNewObject:
  1298.     move.w    #ERROR_DISK_FULL,dp_Res2+2(a4)
  1299. CreateNewObj:
  1300.     movem.l    d3/a2-a3,-(sp)
  1301.     move.l    a2,a0
  1302.     moveq    #myf_Name,d3
  1303. .D    addq.l    #1,d3
  1304.     tst.b    (a0)+
  1305.     bne.s    .D
  1306.     addq.l    #1,d3
  1307.     bclr    #0,d3
  1308.     move.l    d3,d0
  1309.     add.l    d2,d0
  1310.     bsr    AllocMem
  1311.     beq.s    .fail
  1312.     move.l    d0,a1
  1313.     lea    myf_First(a3),a0
  1314. .C    move.l    (a0),d0
  1315.     beq.s    .A
  1316.     move.l    d0,a0
  1317.     bra.s    .C
  1318. .A    move.l    a1,(a0)
  1319.     clr.l    myf_Link(a1)
  1320.     move.l    a3,myf_Parent(a1)
  1321.     move.l    d2,myf_Size(a1)
  1322.     add.l    d2,FileSize(a5)
  1323.     move.b    #-3,myf_Type(a1)
  1324.     move.b    d3,myf_DataOffs(a1)
  1325.     clr.b    myf_Locks(a1)
  1326.     lea    myf_Name(a1),a0
  1327. .E    move.b    (a2)+,(a0)+
  1328.     bne.s    .E
  1329.     move.l    d3,d1
  1330.     move.l    a1,d0
  1331. .fail    IFD    DEBUG
  1332.     move.l    d0,-(sp)
  1333.     lea    myf_Name(a1),a2
  1334.     move.l    myf_Size(a1),d0
  1335.     DBUG3    txcreat,a2,a1,d0
  1336.     move.l    (sp)+,d0
  1337.     ENDC
  1338.     movem.l    (sp)+,d3/a2-a3
  1339.     rts
  1340.  
  1341. * Delete file in a1
  1342. * ENTRY: a1=file
  1343. * EXIT:  d0=success, Z-flag
  1344. DeleteObj:
  1345.     move.w    #ERROR_OBJECT_NOT_FOUND,dp_Res2+2(a4)
  1346.     move.l    myf_Parent(a1),a0
  1347.     move.l    myf_First(a0),d0
  1348.     sub.l    a0,a0
  1349. .C    move.l    a0,d1
  1350.     move.l    d0,a0
  1351.     tst.l    d0
  1352.     beq    DelErr
  1353.     move.l    myf_Link(a0),d0
  1354.     cmp.l    a1,a0
  1355.     bne.s    .C
  1356. * ENTRY: a1=file d1=pred.
  1357. DeleteObject:
  1358.     move.l    d2,-(sp)
  1359.     moveq    #0,d0
  1360.     move.w    #ERROR_OBJECT_IN_USE,dp_Res2+2(a4)
  1361.     tst.b    myf_Locks(a1)
  1362.     bne.s    .fail
  1363.     tst.b    myf_Type(a1)
  1364.     bmi.s    .C
  1365.     move.w    #ERROR_DIRECTORY_NOT_EMPTY,dp_Res2+2(a4)
  1366.     tst.l    myf_First(a1)    check if dir is empty
  1367.     bne.s    .fail
  1368. .C    move.l    myf_Link(a1),d2    rearrange links
  1369.     move.l    d1,a0
  1370.     tst.l    d1
  1371.     bne.s    .A
  1372.     move.w    #ERROR_OBJECT_WRONG_TYPE,dp_Res2+2(a4)
  1373.     move.l    myf_Parent(a1),d1
  1374.     beq.s    .fail        do not delete root
  1375.     move.l    d1,a0
  1376.     lea    myf_First-myf_Link(a0),a0
  1377. .A    move.l    d2,myf_Link(a0)
  1378.     DBUG1    txdel,a1
  1379.     lea    NotifyList(a5),a0
  1380.     bra.s    .D
  1381. .E    move.l    d0,a0
  1382.     cmp.l    myn_Key(a0),a1
  1383.     bne.s    .D
  1384.     clr.l    myn_Key(a0)    check notifications
  1385. .D    move.l    (a0),d0
  1386.     bne.s    .E
  1387.     moveq    #0,d0        free memory
  1388.     move.b    myf_DataOffs(a1),d0
  1389.     move.l    myf_Size(a1),d1
  1390.     add.l    d1,d0
  1391.     sub.l    d1,FileSize(a5)
  1392.     bsr    FreeMem
  1393.     moveq    #1,d0
  1394. .fail    move.l    (sp)+,d2
  1395. DelErr    tst.l    d0
  1396.     rts
  1397.  
  1398. * ENTRY: d0=BPTR parent lock, a0=name (BSTR), d2=access mode
  1399. * EXIT:  d0=APTR lock, Z-flag
  1400. * Must preserve a3
  1401. LocateObject:
  1402.     move.w    #ERROR_OBJECT_NOT_FOUND,dp_Res2+2(a4)
  1403.     move.l    d0,d3
  1404.     bsr    SearchObject
  1405.     bne.s    .A
  1406.     moveq    #ACCESS_READ,d0
  1407.     cmp.l    d0,d2
  1408.     bne.s    .C
  1409.     tst.b    WriteProtected(a5)
  1410.     bne.s    .C
  1411.     tst.l    CopyfromLock(a5)
  1412.     beq.s    .C
  1413.     move.l    d3,d0
  1414.     bsr    CalcFullName
  1415.     bne.s    .A
  1416. .C    moveq    #0,d0
  1417.     bra    LOfail2
  1418. .A    move.l    d0,a2
  1419.     tst.b    myf_Type(a2)    hidden ?
  1420.     beq.s    .C
  1421.  
  1422. * Create lock on file/dir
  1423. * ENTRY: a2=file, d2=access mode
  1424. * EXIT:  d0=success, Z-flag
  1425. CreateLock:
  1426.     moveq    #0,d0
  1427.     move.w    #ERROR_OBJECT_IN_USE,dp_Res2+2(a4)
  1428.     lea    myf_Locks(a2),a0
  1429.     moveq    #ACCESS_WRITE,d1
  1430.     cmp.l    d1,d2
  1431.     bne.s    .A
  1432.     tst.b    (a0)
  1433.     bne.s    LOfail
  1434.     move.b    d1,(a0)
  1435.     bra.s    .C
  1436. .A    tst.b    (a0)
  1437.     bmi.s    LOfail
  1438.     addq.b    #1,(a0)
  1439. .C    move.w    #ERROR_NO_FREE_STORE,dp_Res2+2(a4)
  1440.     move.l    #myl_SIZEOF,d0
  1441.     bsr    AllocMem
  1442.     beq.s    LOfail
  1443.     move.l    d0,a0
  1444.     clr.l    myl_Link(a0)
  1445.     move.l    a2,myl_Key(a0)
  1446.     move.l    d2,myl_Access(a0)
  1447.     move.l    MyMsgPort(a5),myl_Task(a0)
  1448.     move.l    MyVolumeBPTR(a5),myl_Volume(a0)
  1449.     clr.b    myl_Mode(a0)
  1450.     addq.l    #1,NumLocks(a5)
  1451. LOfail    IFD    DEBUG
  1452.     move.l    d0,d1
  1453.     lsr.l    #2,d1
  1454.     lea    myf_Name(a2),a0
  1455.     DBUG3    txlock,a0,d1,d2
  1456.     ENDC
  1457. LOfail2    tst.l    d0
  1458.     rts
  1459.  
  1460. * Free lock in a1 (APTR)
  1461. FreeLock:
  1462. ;    move.w    #ERROR_UNLOCK_ERROR,dp_Res2+2(a4)
  1463.     IFD    DEBUG
  1464.     move.l    a1,d0
  1465.     lsr.l    #2,d0
  1466.     DBUG1    txulock,d0
  1467.     ENDC
  1468.     move.l    myl_Key(a1),a0
  1469.     tst.b    myf_Locks(a0)
  1470.     beq.s    .A
  1471.     bmi.s    .D
  1472.     subq.b    #1,myf_Locks(a0)
  1473.     bra.s    .A
  1474. .D    clr.b    myf_Locks(a0)
  1475. .A    move.l    #myl_SIZEOF,d0
  1476.     bsr    FreeMem
  1477.     subq.l    #1,NumLocks(a5)
  1478.     rts
  1479.  
  1480. *******************************************************
  1481.  
  1482. * ENTRY: d0=size
  1483. AllocMem:
  1484.     add.l    d0,TotalSize(a5)
  1485.     move.l    MyMemPool(a5),d1
  1486.     beq.s    .A
  1487.     move.l    d1,a0
  1488.     CALL    AllocPooled
  1489.     bra.s    .C
  1490. .A    moveq    #1,d1
  1491.     CALL    AllocMem
  1492. .C    tst.l    d0
  1493.     rts
  1494.  
  1495. * ENTRY: d0=size, a1=address
  1496. FreeMem:
  1497.     sub.l    d0,TotalSize(a5)
  1498.     move.l    MyMemPool(a5),d1
  1499.     beq.s    .A
  1500.     move.l    d1,a0
  1501.     CALL    FreePooled
  1502.     rts
  1503. .A    CALL    FreeMem
  1504.     rts
  1505.  
  1506. * Copy BSTR in a0 to string in a1, d0=maxlength without 0
  1507. CopyBSTR2Char:
  1508.     add.l    a0,a0
  1509.     add.l    a0,a0
  1510.     moveq    #0,d1
  1511.     move.b    (a0)+,d1
  1512.     cmp.l    d0,d1
  1513.     bls.s    .C
  1514.     exg.l    d0,d1
  1515.     bra.s    .C
  1516. .A    move.b    (a0)+,(a1)+
  1517. .C    dbra    d1,.A
  1518.     clr.b    (a1)
  1519.     rts
  1520.  
  1521. * Copy string in a0 to BSTR in a1, d0=maxlength without 0
  1522. * EXIT:  d0=BPTR
  1523. CopyChar2BSTR:
  1524.     moveq    #-1,d1
  1525.     addq.l    #1,a1
  1526. .A    addq.l    #1,d1
  1527.     cmp.l    d0,d1
  1528.     bhs.s    .C
  1529.     move.b    (a0)+,(a1)+
  1530.     bne.s    .A
  1531.     subq.l    #1,a1
  1532. .C    clr.b    (a1)
  1533.     sub.l    d1,a1
  1534.     subq.l    #1,a1
  1535.     move.b    d1,(a1)
  1536.     move.l    a1,d0
  1537.     lsr.l    #2,d0
  1538.     rts
  1539.  
  1540. CopyChar2Char:
  1541. * Copy string in a0 to string in a1, d0=maxlength without 0
  1542. .C    move.b    (a0)+,(a1)+
  1543.     beq.s    .A
  1544.     subq.l    #1,d0
  1545.     bne.s    .C
  1546. .A    rts
  1547.  
  1548.  
  1549. * Same as SearchPath, but creates it if not existent
  1550. * ENTRY: TempPath=dirname, d0=lock on dir
  1551. * EXIT:  d0=ptr to file, Z-flag, d1=previous file
  1552. CreatePath:
  1553.     moveq    #1,d1
  1554.     bra.s    SearchP
  1555.  
  1556. * Same as SearchObject, but deletes hidden files
  1557. DelSearchObject
  1558.     bsr    SearchObject
  1559.     beq.s    .A
  1560.     move.l    d0,a1
  1561.     tst.b    myf_Type(a1)
  1562.     bne    .A
  1563.     bsr    DeleteObject    delete hidden file
  1564.     moveq    #0,d0
  1565. .A    rts
  1566.  
  1567. * Look for object with path
  1568. * ENTRY: a0=filename (BSTR), d0=lock on dir
  1569. * EXIT:  d0=ptr to file, Z-flag, d1=previous file, TempPath=name
  1570. SearchObject:
  1571.     move.l    d0,-(sp)
  1572.     lea    TempPath(a5),a1
  1573.     moveq    #MAXPATH-1,d0
  1574.     bsr    CopyBSTR2Char
  1575.     move.l    (sp)+,d0
  1576. * Same as SearchObject, but name already copied to TempPath
  1577. SearchPath:    ;TempPath=dirname, d0=lock on dir
  1578.     moveq    #0,d1
  1579. SearchP    movem.l    d2-d7/a2-a4,-(sp)
  1580.     move.l    d1,d7
  1581.     lea    RootDir(a5),a1
  1582.     lea    TempPath(a5),a0
  1583. .A    cmp.b    #":",(a0)+    skip volume name
  1584.     beq.s    .E
  1585.     tst.b    -1(a0)
  1586.     bne.s    .A
  1587.     lea    TempPath(a5),a0
  1588. .D    lsl.l    #2,d0        use root or locked dir
  1589.     beq.s    .E
  1590.     move.l    d0,a2
  1591.     move.l    myl_Key(a2),a1    dir represented by lock
  1592. .E
  1593. * ENTRY: a0=Name, a1=parent dir; mind SP !
  1594. SearchName:
  1595. .A    moveq    #0,d0
  1596. .D    cmp.b    #"/",(a0)    parent dir when starting with /
  1597.     bne.s    .H
  1598.     move.l    myf_Parent(a1),d2
  1599.     beq.s    .fail
  1600.     move.l    d2,a1
  1601.     addq.l    #1,a0
  1602.     bra.s    .D
  1603. .H    tst.b    (a0)        check for empty string
  1604.     beq.s    .G
  1605.     move.l    a0,a4
  1606.     moveq    #0,d3
  1607. .C    addq.l    #1,d3        look for / or end
  1608.     tst.b    (a4)
  1609.     beq.s    .E
  1610.     cmp.b    #":",(a4)
  1611.     beq.s    .fail
  1612.     cmp.b    #"/",(a4)+
  1613.     bne.s    .C
  1614. .E    tst.b    myf_Type(a1)
  1615.     bmi.s    .fail
  1616.     move.l    a1,d2
  1617.     bsr    SearchEntry    search in dir
  1618.     bne.s    .F
  1619.     tst.l    d7        check for CreatePath
  1620.     beq.s    .G
  1621.     movem.l    d1-d3/a0/a2-a3,-(sp)
  1622.     move.l    d2,a3
  1623.     move.l    a0,a2
  1624.     move.b    -(a4),d3
  1625.     tst.b    1(a4)
  1626.     beq.s    .I
  1627.     clr.b    (a4)
  1628. .I    moveq    #0,d2
  1629.     bsr    CreateNewObj    create new dir
  1630.     move.b    d3,(a4)+
  1631.     move.l    d0,a1
  1632.     movem.l    (sp)+,d1-d3/a0/a2-a3
  1633.     tst.l    d0
  1634.     beq.s    .G
  1635.     move.b    #2,myf_Type(a1)
  1636. .F    move.l    a4,a0
  1637.     bra.s    .A        continue looking for / or end
  1638. .G    move.l    a1,d0
  1639. .fail    IFD    DEBUG
  1640.     lea    TempPath(a5),a0
  1641.     DBUG2    txfnd,a0,d0
  1642.     ENDC
  1643.     movem.l    (sp)+,d2-d7/a2-a4
  1644.     tst.l    d0
  1645.     rts
  1646.  
  1647. * ENTRY: a2=name, a3=parent dir, d2=data size
  1648. * EXIT:  d1=offset of data, d0=new file, Z-flag
  1649.  
  1650.  
  1651. * Look for object in dir
  1652. * ENTRY: a0=file/dir name, a1=ptr to dir, d3=length of name
  1653. * EXIT:  a1=ptr to file or 0, Z-flag
  1654. SearchEntry:
  1655.     moveq    #0,d5
  1656.     moveq    #0,d6
  1657.     move.l    myf_First(a1),d0
  1658.     sub.l    a1,a1
  1659. .C    move.l    a1,d1
  1660.     move.l    d0,a1
  1661.     tst.l    d0
  1662.     beq.s    .fail
  1663.     move.l    myf_Link(a1),d0
  1664.     lea    myf_Name(a1),a2
  1665.     move.l    a0,a3
  1666.     move.l    d3,d4
  1667.     bra.s    .E
  1668. .A    move.b    (a2)+,d5
  1669.     move.b    CharTable(a5,d5.l),d5
  1670.     move.b    (a3)+,d6
  1671.     move.b    CharTable(a5,d6.l),d6
  1672.     cmp.b    d5,d6
  1673.     bne.s    .C
  1674. .E    subq.l    #1,d4
  1675.     bne.s    .A
  1676.     tst.b    (a2)
  1677.     bne.s    .C
  1678. ;    IFD    DEBUG
  1679. ;    lea    myf_Name(a1),a3
  1680. ;    DBUG1    txentry,a3
  1681. ;    ENDC
  1682. .fail    move.l    a1,d0
  1683.     rts
  1684.  
  1685. *Splits path with file into path=TempPath and file=TempName
  1686. SplitPath
  1687.     move.l    a2,-(sp)
  1688.     lea    TempPath(a5),a0
  1689.     move.l    a0,a1
  1690. .A    tst.b    (a0)+
  1691.     bne.s    .A
  1692. .D    cmp.b    #"/",-(a0)
  1693.     beq.s    .C
  1694.     cmp.b    #":",(a0)
  1695.     beq.s    .C
  1696.     cmp.l    a0,a1
  1697.     bne.s    .D
  1698.     move.l    a0,a1
  1699.     bra.s    .G
  1700. .C    move.l    a0,a1
  1701.     addq.l    #1,a1
  1702. .G    lea    TempName(a5),a2
  1703. .E    move.b    (a1)+,(a2)+
  1704.     bne.s    .E
  1705.     cmp.b    #":",(a0)
  1706.     bne.s    .F
  1707.     addq.l    #1,a0
  1708. .F    clr.b    (a0)
  1709.     move.l    (sp)+,a2
  1710.     IFD    DEBUG
  1711.     lea    TempPath(a5),a0
  1712.     lea    TempName(a5),a1
  1713.     DBUG2    txsplit,a0,a1
  1714.     ENDC
  1715.     rts
  1716.  
  1717. * ENTRY: a1=object
  1718. * EXIT:  a0=full name (root name not included) in TempPath
  1719. * Only used by CalcFullName
  1720. GetFullName:
  1721.     move.l    d2,-(sp)
  1722.     lea    TempPath+MAXPATH+MAXNAME-1(a5),a0
  1723.     clr.b    (a0)
  1724.     move.w    #MAXPATH+MAXNAME-1,d2
  1725. .A    move.l    myf_Parent(a1),d0
  1726.     beq.s    .ok
  1727.     lea    myf_Name(a1),a1
  1728.     moveq    #-1,d1
  1729. .C    addq.l    #1,d1
  1730.     tst.b    (a1)+
  1731.     bne.s    .C
  1732.     subq.l    #1,a1
  1733.     sub.w    d1,d2
  1734.     bmi.s    .ok
  1735.     tst.b    (a0)
  1736.     beq.s    .D
  1737.     move.b    #"/",-(a0)
  1738.     subq.w    #1,d2
  1739.     bra.s    .D
  1740. .E    move.b    -(a1),-(a0)
  1741. .D    dbra    d1,.E
  1742.     move.l    d0,a1
  1743.     bra.s    .A
  1744. .ok    move.l    (sp)+,d2
  1745.     rts
  1746.  
  1747. * ENTRY: TempPath=name, d0=BPTR parent lock
  1748. * Only used by LocateObject
  1749. CalcFullName:
  1750.     movem.l    d2-d5/a2-a4,-(sp)
  1751.     moveq    #0,d4            d4=return code
  1752.     bsr    CreatePath
  1753.     beq    .fail
  1754.     move.l    d0,a1
  1755.     move.l    d0,a2
  1756.     clr.b    myf_Type(a1)        a2=new hidden file
  1757.     bsr    GetFullName
  1758.     DBUG1    txfull,a0
  1759.     lea    TempPath(a5),a1
  1760.     moveq    #MAXPATH-2,d0
  1761.     bsr    CopyChar2BSTR
  1762.     move.l    d0,d5            d5=BSTR full name
  1763.  
  1764.     move.l    #fib_SIZEOF+fh_SIZEOF,d0
  1765.     bsr    AllocMem
  1766.     beq    .fail
  1767.     move.l    d0,a3            a3=File info block
  1768.     lea    fib_SIZEOF(a3),a4    a4=file handle
  1769.     move.l    CopyfromLock(a5),d1
  1770.     move.l    d5,d2
  1771.     moveq    #ACCESS_READ,d3
  1772.     moveq    #ACTION_LOCATE_OBJECT,d0
  1773.     bsr    DoPacket
  1774.     beq    .fail2
  1775.     move.l    d0,d3            d3=lock on file
  1776.     move.l    d3,d1
  1777.     move.l    a3,d2
  1778.     lsr.l    #2,d2
  1779.     moveq    #ACTION_EXAMINE_OBJECT,d0
  1780.     bsr    DoPacket
  1781.     move.l    d0,-(sp)
  1782.     move.l    d3,d1
  1783.     moveq    #ACTION_FREE_LOCK,d0
  1784.     bsr    DoPacket
  1785.     move.l    (sp)+,d0
  1786.     beq.s    .fail2
  1787.     tst.l    fib_DirEntryType(a3)
  1788.     bpl.s    .fail2
  1789.  
  1790.     move.l    a4,d1
  1791.     lsr.l    #2,d1
  1792.     move.l    CopyfromLock(a5),d2
  1793.     move.l    d5,d3
  1794.     move.l    #ACTION_FINDINPUT,d0
  1795.     bsr    DoPacket
  1796.     beq.s    .fail2
  1797.     movem.l    a2/a3,-(sp)
  1798.     move.l    fib_Size(a3),d2
  1799.     move.l    myf_Parent(a2),a3
  1800.     lea    myf_Name(a2),a2
  1801.     bsr    CreateNewObject
  1802.     movem.l    (sp)+,a2/a3
  1803.     beq.s    .fail3
  1804.     move.l    d0,d2
  1805.     add.l    d1,d2
  1806.     move.l    a2,a1
  1807.     move.l    d0,a2
  1808.     bsr    DeleteObj
  1809.     beq.s    .fail3
  1810.     move.l    fh_Arg1(a4),a4
  1811.     move.l    a4,d1
  1812.     move.l    fib_Size(a3),d3
  1813.     moveq    #ACTION_READ,d0
  1814.     bsr    DoPacket
  1815.     bsr    UpdateNotify
  1816. .fail3    move.l    a4,d1
  1817.     move.l    #ACTION_END,d0
  1818.     bsr    DoPacket
  1819.     move.l    a2,d4
  1820. .fail2    move.l    a3,a1
  1821.     move.l    #fib_SIZEOF+fh_SIZEOF,d0
  1822.     bsr    FreeMem
  1823. .fail    move.l    d4,d0
  1824.     movem.l    (sp)+,d2-d5/a2-a4
  1825.     rts
  1826.  
  1827. *******************************************************
  1828.  
  1829.     IFD    DEBUG
  1830. RawHook    move.l    a6,-(sp)
  1831.     move.l    4.w,a6
  1832.     jsr    _LVORawPutChar(a6)
  1833.     move.l    (sp)+,a6
  1834.     rts
  1835.  
  1836. wait_c:
  1837.     movem.l    d0-d1/a0-a1,-(sp)
  1838.     moveq    #0,d0
  1839.     moveq    #0,d1
  1840.     bset    #12,d1
  1841.     jsr    _LVOSetSignal(a6)
  1842.     moveq    #0,d0
  1843.     bset    #12,d0
  1844.     jsr    _LVOWait(a6)    wait for CTRL-C
  1845.     movem.l    (sp)+,d0-d1/a0-a1
  1846.     rts
  1847.  
  1848.     IFD    VERBOSE
  1849. txstart    dc.b    "Handler started, A5=$%lx.",10,0
  1850. txend    dc.b    "Handler ended, FileSize=%ld, TotalSize=%ld.",10,0
  1851. txcopy    dc.b    "Copyfrom: Port=$%lx, Lock=$%lx.",10,0
  1852. txpack    dc.b    "Type=%ld Arg1=$%lx Arg2=$%lx Arg3=$%lx.",10,0
  1853. txres    dc.b    "Result1=$%lx, Result2=%ld.",10,0
  1854. txpkt    dc.b    "  Packet=$%lx, type=%ld, res=$%lx, err=%ld.",10,0
  1855. txerr1    dc.b    "  %ld: Unknown Action.",10,0
  1856.  
  1857. txopeno    dc.b    "  Oldopen lock=$%lx.",10,0
  1858. txopenn    dc.b    "  Newopen lock=$%lx.",10,0
  1859. txcreat    dc.b    "  Created file %s=$%lx size=%ld.",10,0
  1860. txread    dc.b    "  Read %ld of %ld bytes, pos=%ld.",10,0
  1861. txwrite    dc.b    "  Wrote %ld bytes, pos=%ld, size=%ld.",10,0
  1862. txwins    dc.b    "  Inserted %ld bytes at %ld.",10,0
  1863. txseek    dc.b    "  Seeked, filepos=%ld.",10,0
  1864. txdel    dc.b    "  Deleted $%lx.",10,0
  1865.  
  1866. txlock    dc.b    "  Locked %s=$%lx mode %ld.",10,0
  1867. txulock    dc.b    "  Unlocked $%lx.",10,0
  1868. txexam    dc.b    "  Examined file=$%lx.",10,0
  1869. txexnx    dc.b    "  Examined next file=$%lx.",10,0
  1870. txfnd    dc.b    "    Found %s=$%lx.",10,0
  1871. txentry    dc.b    "    Found entry %s.",10,0
  1872. txsplit    dc.b    "    Splitted ->%s,%s.",10,0
  1873. txfull    dc.b    "    Full name: %s.",10,0
  1874.  
  1875. txanoti    dc.b    "  Added noti $%lx->$%lx on %s key=$%lx.",10,0
  1876. txrnoti    dc.b    "  Removed noti $%lx->$%lx.",10,0
  1877. txcnoti    dc.b    "  Checking noti on %s.",10,0
  1878. txunoti    dc.b    "    Updated noti on %s key=$%lx.",10,0
  1879. txsnoti    dc.b    "    Sent signal to %s for %s.",10,0
  1880. txmnoti    dc.b    "    Sent message $%lx to %s for %s.",10,0
  1881. txgnoti    dc.b    "    Got message $%lx.",10,0
  1882.     ENDC
  1883.  
  1884.     IFND    VERBOSE
  1885. txstart    dc.b    "Handler started, A5=$%lx.",10,0
  1886. txend    dc.b    "Handler ended, FileSize=%ld, TotalSize=%ld.",10,0
  1887. txcopy    dc.b    "Copyfrom: Port=$%lx, Lock=$%lx.",10,0
  1888. txpack    dc.b    0;"Type=%ld Arg1=$%lx Arg2=$%lx Arg3=$%lx.",10,0
  1889. txres    dc.b    0;"Result1=$%lx, Result2=%ld.",10,0
  1890. txpkt    dc.b    0;"  Packet=$%lx, type=%ld, res=$%lx, err=%ld.",10,0
  1891. txerr1    dc.b    "  %ld: Unknown Action.",10,0
  1892.  
  1893. txopeno    dc.b    0;"  Oldopen lock=$%lx.",10,0
  1894. txopenn    dc.b    0;"  Newopen lock=$%lx.",10,0
  1895. txcreat    dc.b    "  Created file %s=$%lx size=%ld.",10,0
  1896. txread    dc.b    0;"  Read %ld of %ld bytes, pos=%ld.",10,0
  1897. txwrite    dc.b    0;"  Wrote %ld bytes, pos=%ld, size=%ld.",10,0
  1898. txwins    dc.b    0;"  Inserted %ld bytes at %ld.",10,0
  1899. txseek    dc.b    0;"  Seeked, filepos=%ld.",10,0
  1900. txdel    dc.b    "  Deleted $%lx.",10,0
  1901.  
  1902. txlock    dc.b    0;"  Locked %s=$%lx mode %ld.",10,0
  1903. txulock    dc.b    0;"  Unlocked $%lx.",10,0
  1904. txexam    dc.b    0;"  Examined file=$%lx.",10,0
  1905. txexnx    dc.b    0;"  Examined next file=$%lx.",10,0
  1906. txfnd    dc.b    0;"    Found %s=$%lx.",10,0
  1907. txentry    dc.b    0;"    Found entry %s.",10,0
  1908. txsplit    dc.b    0;"    Splitted ->%s,%s.",10,0
  1909. txfull    dc.b    0;"    Full name: %s.",10,0
  1910.  
  1911. txanoti    dc.b    0;"  Added noti $%lx->$%lx on %s key=$%lx.",10,0
  1912. txrnoti    dc.b    0;"  Removed noti $%lx->$%lx.",10,0
  1913. txcnoti    dc.b    0;"  Checking noti on %s.",10,0
  1914. txunoti    dc.b    0;"    Updated noti on %s key=$%lx.",10,0
  1915. txsnoti    dc.b    0;"    Sent signal to %s for %s.",10,0
  1916. txmnoti    dc.b    0;"    Sent message $%lx to %s for %s.",10,0
  1917. txgnoti    dc.b    0;"    Got message $%lx.",10,0
  1918.     ENDC
  1919.  
  1920.     ENDC
  1921.  
  1922.